---
title: 重新设置磁盘分区以及 Btrfs 子卷（subvolume）布局的无损方案
description: "本文介绍了如何不需要迁移数据的情况下，无损地重新设置分区方案，包括将交换分区更改成交换文件、如何将分区重新编号排序以及重新设计 Btrfs 子卷布局"
date: "2025-05-01"
lang: zh
tags:
  - Linux
  - Btrfs
category: 技术
cover: https://cdn.qladgk.com/images/20250508163537952.png
---

import Image from "@/components/mdx/Image";

<Image
  src="https://cdn.qladgk.com/images/20250508163537952.png"
  alt="cover"
  width={999}
  height={527}
  isArticleImage={true}
/>

## 效果预览

### 之前的方案

import { QuickView } from "@/components/mdx/Link";

通过之前写的文章：<QuickView href="/blog/debian-btrfs-subvolumes">如何在安装 Debian 时配置 Btrfs 子卷 | 详细分步指南</QuickView>

对安装好的 Debian sid 做了如下分区方案

```json
├─nvme0n1p1 259:1    487M  part /boot/efi
├─nvme0n1p2 259:1     16G  part SWAP
└─nvme0n1p3 259:2  226.4G  part /
                                /home
```

其中 nvme0n1p3 里有两个子卷，分别是 @ 和 @home 采用扁平式布局，而且介绍了 Timeshift 快照工具

但是使用后发现 Timeshift 不支持自定义快照存放的位置，而且 Swap 用分区的形式不方便管理，于是便有了这篇文章，记录我更改的过程

### 优化后的方案

保留 @ 和 @home 子卷，新增 @var @tmp @snapshots 子卷，使用 Zram 作为 SWAP。并且重新对分区进行编号，不能格式化磁盘

```json
├─nvme0n1p1 259:1    0   487M  0 part /boot/efi
└─nvme0n1p2 259:2    0 232.4G  0 part /
                                      /home
                                      /var
                                      /tmp
                                      /.snapshots
```

之所以要将 /var 以子卷的形式存放，是为了后续使用 snapper 的方便

### 准备工具

只需要一个 Fedora KDE 版本的 liveCD 即可

其实哪个版本并不重要只要有 btrfs 工具就行，关键是 KDE 里面的分区工具很好用，避免可以敲错命令

## 方法步骤

### 1. 重启进入 LiveCD

之所以进 LiveCD 是为了方便对 `/` 进行操作，而且在 LiveCD 里面方便对子卷重新布局

### 2. 重新设计分区

在 KDE 的分区管理工具中，找到你的 SWAP 分区（nvme0n1p2）删掉就行，删掉之后会变成 Free Space

<Image
  src="https://cdn.qladgk.com/images/20250501115352925.png"
  alt="删除 Swap 分区"
  width={666}
  height={527}
  isArticleImage={true}
/>

> 这是我随便截的一张图，必须按照你自己的分区表来删除

现在的分区表变成了一个 nvme0n1p1、一个 FreeSPace 和一个 nvme0n1p3，并且保证这三个是紧挨着的

然后选择之前的 nvme0n1p3 重新调整分区大小

<Image
  src="https://cdn.qladgk.com/images/20250501115806388.png"
  alt="重新调整分区大小"
  width={666}
  height={527}
  isArticleImage={true}
/>

你可以拖动 1 和 2 的位置让 nvme0n1p3 占满所有空余空间，也可以直接填写 0MB 到前方空置和后方空置

> 这是我随便截的一张图，必须按照你自己的分区表来删除

这里的调整分区大小需要将分区 nvme0n1p3 里面所有的文件往前移动，所以需要一点时间

调整完成之后保存并写入，现在你的磁盘就只剩下了 nvme0n1p1 和 nvme0n1p3 这两个分区

然后通过 sfdisk 对分区重新排序，在 LiveCD 的终端执行如下命令（需要用 root 账户）

```bash
sfdisk -r /dev/nvme0n1
```

这里是选择的你的磁盘而不是分区，按照自己电脑进行调整

现在，你的分区已经变成了 nvme0n1p1 和 nvme0n1p2 ，分区重新设置的部分到此结束了

### 3. 重新设计 Btrfs 子卷布局

继续在刚才 LiveCD 的终端里面操作

将 Btrfs 分区挂载到任意目录下，比如说 /mnt

```bash
mount /dev/nvme0n1p2 /mnt
```

然后可以查看下 /mnt 下的现有子卷

```bash
btrfs subvolume list /mnt
```

如果你是按照我之前的文件进行设计的话，你应该会有一个 @ 和 @home

然后新增你需要的子卷

```bash
cd /mnt # 进入 /mnt 后再操作

btrfs su cr @var
btrfs su cr @tmp
btrfs su cr @snapshot
```

> su 是 subvolume 的缩写、cr 是 create 的缩写

接下来要看好 @/ 和 @ 的位置关系，不要敲错了命令

将 @ 子卷中的 /var 和 /tmp 中的文件移动到 @var 和 @tmp 中

```bash
mv @/var @var
mv @/tmp @tmp
```

因为 @snapshot 子卷我们会挂载到 /.snapshot 上，所以需要创建这个目录

```bash
mkdir @/.snapshot
```

现在的子卷布局已经重新设计并且迁移了数据，不出意外的话，查看 /mnt 下的子卷应该出现如下内容

```bash
btrfs subvolume list /mnt

top level 5 path @
top level 5 path @home
top level 5 path @var
top level 5 path @tmp
top level 5 path @snapshots
```

子卷的重新布局到此结束

### 4. 修改 fstab

这里对 btrfs 子卷添加一些特性参数挂载

```bash
UUID=$(blkid -s UUID -o value /dev/nvme0n1p2)  # 获取 Btrfs 分区的 UUID

tee /mnt/@/etc/fstab <<EOF
UUID=${UUID}  /           btrfs  noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots  0  0
UUID=${UUID}  /home       btrfs  noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots  0  0
UUID=${UUID}  /var        btrfs  noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots  0  0
UUID=${UUID}  /tmp        btrfs  noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots  0  0
UUID=${UUID}  /.snapshots btrfs  noatime,space_cache=v2,compress=zstd:1,ssd,discard=async,subvol=@snapshots  0  0
EOF
```

最后查看你的 /mnt/@/etc/fstab 应该如下图所示

<Image
  src="https://cdn.qladgk.com/images/20250501124450614.png"
  alt="/etc/fstab"
  width={999}
  height={527}
  isArticleImage={true}
/>

### 5. 重启进入正常的系统

修改完毕后卸载 /mnt 并且重新到 Debian 系统

```bash
umount /mnt
reboot
```

重启之后你可以验证当前的分区表和子卷

### 6. 设置 Zram

安装 Zram 组件

```bash
sudo apt update && sudo apt upgrade
sudo apt install zram-tools
```

修改 Zram 配置文件

```bash
sudo vim /etc/default/zramswap
```

<Image
  src="https://cdn.qladgk.com/images/20250501125247931.png"
  alt="Zram 配置文件"
  width={999}
  height={527}
  isArticleImage={true}
/>

主要就是改一下大小，我这里修改成内容的 60% 其他不变

然后重新加载服务

```bash
sudo service zramswap reload
```

可以通过 zramctl 验证你的修改

<Image
  src="https://cdn.qladgk.com/images/20250501125552636.png"
  alt="Zram 交换"
  width={999}
  height={527}
  isArticleImage={true}
/>

## 接下来...

接下来就可以使用 snapper 这个更强大的快照工具了

具体可以去看 Arch Wiki https://wiki.archlinux.org/title/Snapper
